package abs.service;

import abs.beans.LoginBean;
import abs.dao.TipoCuentasDAO;

import abs.domain.TipoCuentas;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for TipoCuentas entities
 * 
 */

@Service("TipoCuentasService")
@Transactional
public class TipoCuentasServiceImpl implements TipoCuentasService {

	/**
	 * DAO injected by Spring that manages TipoCuentas entities
	 * 
	 */
	@Autowired
	private TipoCuentasDAO tipoCuentasDAO;

	/**
	 * Instantiates a new TipoCuentasServiceImpl.
	 *
	 */
	public TipoCuentasServiceImpl() {
	}

	/**
	 */
	@Override
	@Transactional
	public TipoCuentas findTipoCuentasByPrimaryKey(String co020tipo) {
		return tipoCuentasDAO.findTipoCuentasByPrimaryKey(co020tipo);
	}

	/**
	 * Delete an existing TipoCuentas entity
	 * 
	 */
	@Override
	@Transactional
	public void deleteTipoCuentas(TipoCuentas tipocuentas) {
		try {
			tipoCuentasDAO.remove(tipocuentas);
			tipoCuentasDAO.flush();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Borrado Exitoso"));
		} catch (javax.persistence.EntityExistsException e) {
			//logger.error();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("catched EntityExistsException " + e.toString()));
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("catched generic Exception " + e.getMessage()));
			//logger.error("catched generic Exception " + e.getMessage());
		}
	}

	/**
	 * Save an existing TipoCuentas entity
	 * 
	 */
	@Override
	@Transactional
	public void saveTipoCuentas(TipoCuentas tipocuentas) {
		TipoCuentas existingTipoCuentas = tipoCuentasDAO.findTipoCuentasByPrimaryKey(tipocuentas.getCo020tipo());

		FacesContext context = FacesContext.getCurrentInstance();
		LoginBean login = context.getApplication().evaluateExpressionGet(context, "#{loginBean}", LoginBean.class);
		String codcompania = login.getCodcompania();
		String username = login.getUsername();
		Calendar rightNow = Calendar.getInstance();

		if (existingTipoCuentas != null) {
			if (existingTipoCuentas != tipocuentas) {
				existingTipoCuentas.setCo020tipo(tipocuentas.getCo020tipo());
				existingTipoCuentas.setCo020desc(tipocuentas.getCo020desc());
				existingTipoCuentas.setCo020clcu(tipocuentas.getCo020clcu());
				existingTipoCuentas.setCo020timo(tipocuentas.getCo020timo());
				existingTipoCuentas.setCo020load(tipocuentas.getCo020load());
				existingTipoCuentas.setCo020fead(tipocuentas.getCo020fead());
				existingTipoCuentas.setCo020lomo(username);
				existingTipoCuentas.setCo020femo(rightNow);
			}
			tipocuentas = tipoCuentasDAO.store(existingTipoCuentas);
		} else {
			tipocuentas.setCo020load(username);
			tipocuentas.setCo020lomo(username);
			tipocuentas.setCo020femo(rightNow);
			tipocuentas.setCo020fead(rightNow);
			tipocuentas = tipoCuentasDAO.store(tipocuentas);
		}
		tipoCuentasDAO.flush();
	}

	/**
	 * Return all TipoCuentas entity
	 * 
	 */
	@Override
	@Transactional
	public List<TipoCuentas> findAllTipoCuentass(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<TipoCuentas>(tipoCuentasDAO.findAllTipoCuentass(startResult, maxRows));
	}

	/**
	 * Return a count of all TipoCuentas entity
	 * 
	 */
	@Override
	@Transactional
	public Integer countTipoCuentass() {
		return ((Long) tipoCuentasDAO.createQuerySingleResult("select count(o) from TipoCuentas o").getSingleResult()).intValue();
	}

	/**
	 * Load an existing TipoCuentas entity
	 * 
	 */
	@Override
	@Transactional
	public Set<TipoCuentas> loadTipoCuentass() {
		return tipoCuentasDAO.findAllTipoCuentass();
	}
}
